package lu.med.praxiswahl.wahlumed.client.menustructure;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

import lu.med.praxiswahl.wahlumed.client.arztbriefe.ArztbriefPanel;
import lu.med.praxiswahl.wahlumed.client.kalender.FromToDialog;
import lu.med.praxiswahl.wahlumed.client.ordonancen.OrdonancenNewDialog;
import lu.med.praxiswahl.wahlumed.client.ordonancen.OrdonancenPanel;
import lu.med.praxiswahl.wahlumed.client.utilities.UniCode;
import lu.med.praxiswahl.wahlumed.client.wclient.LoginDialog;
import lu.med.praxiswahl.wahlumed.client.wclient.Main;
import lu.med.praxiswahl.wahlumed.client.wclient.PasswordChangerDialog;
import lu.med.praxiswahl.wahlumed.model.beans.AccountingTBL;

/**
 * 
 * @author Lars Holger Roth
 */
@SuppressWarnings("serial")
public class MainMenu extends JMenuBar implements ActionListener {

	private Main dataManager;
	private JMenuItem changePassword;

	public MainMenu(final Main dataManager, OrdonancenPanel ordonancenPanel,
			ArztbriefPanel abp, ArztbriefPanel arztbrief) {
		super();
		this.dataManager = dataManager;
		JMenu main = new JMenu("Programm");
		JMenu vorlagen = new JMenu("Vorlagen");
		JMenu ordonancen = new JMenu("Ordonancen");
		JMenu kalender = new JMenu("Kalender");
		JMenu settings = new JMenu("Einstellungen");

		changePassword = new JMenuItem("Passwort " + UniCode.getae() + "dern");
		changePassword.setIcon(new javax.swing.ImageIcon(getClass()
				.getResource("/change_password.png")));
		changePassword.addActionListener(this);

		JMenuItem kalenderDeleteMarking = new JMenuItem("Markierung l"
				+ UniCode.getoe() + "schen");
		kalenderDeleteMarking.setIcon(new javax.swing.ImageIcon(getClass()
				.getResource("/remove_mark.png")));
		kalenderDeleteMarking
				.addActionListener(new KalenderVonBisActionListener(
						dataManager, FromToDialog.MODE_DELETE));
		JMenuItem kalenderMarkVacation = new JMenuItem("Urlaub markieren");
		kalenderMarkVacation.setIcon(new javax.swing.ImageIcon(getClass()
				.getResource("/mark_urlaub.png")));
		kalenderMarkVacation
				.addActionListener(new KalenderVonBisActionListener(
						dataManager, FromToDialog.MODE_URLAUB));
		JMenuItem kalenderMarkHoliday = new JMenuItem("Feiertag markieren");
		kalenderMarkHoliday.setIcon(new javax.swing.ImageIcon(getClass()
				.getResource("/mark_feiertag.png")));
		kalenderMarkHoliday.addActionListener(new KalenderVonBisActionListener(
				dataManager, FromToDialog.MODE_FEIERTAG));
		kalender.add(kalenderDeleteMarking);
		kalender.add(kalenderMarkVacation);
		kalender.add(kalenderMarkHoliday);

		JMenu ordRezept = new JMenu("Schl" + UniCode.getue() + "sselw"
				+ UniCode.getoe() + "rter Rezept");
		JMenu ordLabor = new JMenu("Schl" + UniCode.getue() + "sselw"
				+ UniCode.getoe() + "rter Labor");
		JMenu ordUeberweisung = new JMenu("Schl" + UniCode.getue() + "sselw"
				+ UniCode.getoe() + "rter " + UniCode.getUE() + "berweisung");
		ordonancen.add(ordRezept);
		ordonancen.add(ordLabor);
		ordonancen.add(ordUeberweisung);

//		JMenuItem vorlArztbriefe = new JMenuItem("Arztbriefe");
//		vorlArztbriefe.addActionListener(new ArztbriefeVorlagenActionListener(
//				dataManager, arztbrief));
//		vorlagen.add(vorlArztbriefe);
//		JMenuItem vorlMessage = new JMenuItem("Message");
//		vorlMessage
//				.addActionListener(new ArztbriefMessageVorlagenActionListener(
//						dataManager, abp));
//		vorlagen.add(vorlMessage);

		JMenuItem ordRezeptNew = new JMenuItem("Neu");
		ordRezeptNew.addActionListener(new OrdonancenDialogActionListener(
				ordonancenPanel.getListModel(), dataManager, ordonancenPanel,
				OrdonancenNewDialog.MODE_NEW, "_REZEPT", 0l));
		JMenuItem ordRezeptEdit = new JMenuItem("Bearbeiten");
		ordRezeptEdit.addActionListener(new OrdonancenDialogActionListener(
				ordonancenPanel.getListModel(), dataManager, ordonancenPanel,
				OrdonancenNewDialog.MODE_EDIT, "_REZEPT", ordonancenPanel
						.getCurID()));
		JMenuItem ordRezeptDelete = new JMenuItem("L" + UniCode.getoe()
				+ "schen");
		ordRezeptDelete.addActionListener(new OrdonancenDropActionListener(
				ordonancenPanel, OrdonancenDropActionListener.MODE_REZEPT));

		JMenuItem ordLaborNew = new JMenuItem("Neu");
		ordLaborNew.addActionListener(new OrdonancenDialogActionListener(
				ordonancenPanel.getListModel(), dataManager, ordonancenPanel,
				OrdonancenNewDialog.MODE_NEW, "_LABOR", 0l));
		JMenuItem ordLaborEdit = new JMenuItem("Bearbeiten");
		ordLaborEdit.addActionListener(new OrdonancenDialogActionListener(
				ordonancenPanel.getListModel(), dataManager, ordonancenPanel,
				OrdonancenNewDialog.MODE_EDIT, "_LABOR", ordonancenPanel
						.getCurID()));
		JMenuItem ordLaborDelete = new JMenuItem("L" + UniCode.getoe()
				+ "schen");
		ordLaborDelete.addActionListener(new OrdonancenDropActionListener(
				ordonancenPanel, OrdonancenDropActionListener.MODE_LABOR));

		JMenuItem ordUeberweisungNew = new JMenuItem("Neu");
		ordUeberweisungNew
				.addActionListener(new OrdonancenDialogActionListener(
						ordonancenPanel.getListModel(), dataManager,
						ordonancenPanel, OrdonancenNewDialog.MODE_NEW, "_"
								+ UniCode.getUE() + "BERWEISUNG", 0l));
		JMenuItem ordUeberweisungEdit = new JMenuItem("Bearbeiten");
		ordUeberweisungEdit
				.addActionListener(new OrdonancenDialogActionListener(
						ordonancenPanel.getListModel(), dataManager,
						ordonancenPanel, OrdonancenNewDialog.MODE_EDIT, "_"
								+ UniCode.getUE() + "BERWEISUNG",
						ordonancenPanel.getCurID()));
		JMenuItem ordUeberweisungDelete = new JMenuItem("L" + UniCode.getoe()
				+ "schen");
		ordUeberweisungDelete
				.addActionListener(new OrdonancenDropActionListener(
						ordonancenPanel,
						OrdonancenDropActionListener.MODE_UEBERWEISUNG));

		ordRezept.add(ordRezeptNew);
		ordRezept.add(ordRezeptEdit);
		ordRezept.add(ordRezeptDelete);

		ordLabor.add(ordLaborNew);
		ordLabor.add(ordLaborEdit);
		ordLabor.add(ordLaborDelete);

		ordUeberweisung.add(ordUeberweisungNew);
		ordUeberweisung.add(ordUeberweisungEdit);
		ordUeberweisung.add(ordUeberweisungDelete);

		// JMenuItem mainScreensaver = new JMenuItem("Bildschirm sperren");
		// mainScreensaver.addActionListener(new
		// ScreensaverActionListener(dataManager));
		JMenuItem mainExit = new JMenuItem("Beenden");
		mainExit.setIcon(new javax.swing.ImageIcon(getClass().getResource(
				"/exit.png")));
		mainExit.addActionListener(new MenuListenerMainExitActionListener(
				dataManager));
//		JMenu mainNachrichten = new JMenu("Nachrichten");
//		JMenuItem msgNew = new JMenuItem("Nachricht versenden");
//		JMenuItem msgGet = new JMenuItem("Nachrichten vom Server holen");
//		JMenuItem msgManager = new JMenuItem("" + UniCode.getUE() + "bersicht");
//		mainNachrichten.add(msgNew);
//		mainNachrichten.add(msgGet);
//		mainNachrichten.add(msgManager);
//		 main.add(mainNachrichten);
//		 main.add(mainScreensaver);
//		 main.addSeparator();

		JMenuItem optionsGeneral = new JMenuItem("Bildschirmsperre Optionen");
		JMenuItem optionsFormularDesigner = new JMenuItem("Formular Designer");
		JMenuItem optionsTarife = new JMenuItem("Tarife");
		JMenuItem optionsOPTarife = new JMenuItem("OP Tarife");
		JMenuItem optionsOPSettlementCode = new JMenuItem("Abrechnungscode");
		JMenuItem optionsZertifikate = new JMenuItem("Certifikate");
		JMenuItem optionsArztDatabase = new JMenuItem("" + UniCode.getAE()
				+ "rzte Datenbank");
		optionsArztDatabase.setIcon(new javax.swing.ImageIcon(getClass().getResource(
				"/person_group.png")));
		optionsGeneral
				.addActionListener(new MenuListenerOptionsGeneralActionListener(
						dataManager));
		optionsArztDatabase
				.addActionListener(new MenuListenerOptionsArztActionListener(
						dataManager));
		optionsTarife
				.addActionListener(new MenuListenerOptionsTarifActionListener(
						dataManager));

		optionsOPTarife
				.addActionListener(new MenuListenerOptionsOPTarifActionListener());

		optionsOPSettlementCode
				.addActionListener(new MenuListenerOptionsOPSettlmentCodeActionListener());

		optionsZertifikate
				.addActionListener(new MenuListenerOptionsZertifikateActionListener(
						dataManager));
		optionsFormularDesigner.addActionListener(new MenuListenerOptionsFormularDesigner());
		
		settings.add(optionsGeneral);
		settings.add(optionsTarife);
		settings.add(optionsOPTarife);
		settings.add(optionsOPSettlementCode);
		settings.add(optionsArztDatabase);
		settings.add(changePassword);
		//settings.add(optionsFormularDesigner);

		JMenuItem accountLogOff = new JMenuItem("Sperren");
		accountLogOff.setIcon(new javax.swing.ImageIcon(getClass().getResource(
				"/lock.png")));
		accountLogOff.addActionListener(this);
		JMenuItem accountManagement = new JMenuItem("Rechteverwaltung");
		accountManagement
				.addActionListener(new MenuListenerAccountManagementActionListener(
						dataManager));
		settings.add(accountManagement);
		main.add(accountLogOff);
		main.add(mainExit);

		this.add(main);
		vorlagen.add(ordonancen);
		this.add(vorlagen);
		this.add(kalender);
		this.add(settings);
	}

	@Override
	public void actionPerformed(ActionEvent evt) {

		JMenuItem item = (JMenuItem) evt.getSource();

		if (item.getActionCommand().equals("Sperren")) {

			// Blocks the UI
			dataManager.lockClientView();

			LoginDialog login = new LoginDialog(dataManager);
			login.getUsernameTextField().setText(Main.loggedUser.getLogin());
			login.getUsernameTextField().setEnabled(false);
			login.getPasswordTextField().requestFocusInWindow();
			login.getCancelButton().setEnabled(false);
			login.getErrorLabel().setIcon(
					new javax.swing.ImageIcon(getClass().getResource(
							"/lock.png")));
			login.getErrorLabel().setText(
					"Maske gesperrt. Um forzusetzen melden Sie sich erneut an");
			
			login.display();
			
		} else if (item.getActionCommand().equals(
				"Passwort " + UniCode.getae() + "dern")) {
			this.changePwd();
		}

	}

	private void changePwd() {

		AccountingTBL account = this
				.retrieveAccount(Main.loggedUser.getLogin());

		if (account != null) {

			new PasswordChangerDialog(account, dataManager);
		} else {

			JOptionPane.showMessageDialog(this, "Benutzer existier nicht!");
		}

	}

	private AccountingTBL retrieveAccount(String username) {

		AccountingTBL[] accounts = dataManager.getAccountContext()
				.showsAvailableUsers();
		for (AccountingTBL tbl : accounts) {
			if (tbl.getLogin().equalsIgnoreCase(username)) {
				return tbl;
			}
		}
		return null;
	}

}
